/*
 * @Author: liuying 247220246@qq.com
 * @Date: 2025-02-06 13:44:00
 * @LastEditors: liuying 247220246@qq.com
 * @LastEditTime: 2025-02-07 11:10:39
 * @FilePath: \my-book-react\src\bases\countdown\utils.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
const DAY_MILLISECONDS = 24 * 60 * 60 * 1000; // 一天的毫秒数
const HOURS_MILLISECONDS = 60 * 60 * 1000; // 一小时的毫秒数
const MINUTES_MILLISECONDS = 60 * 1000; // 一分钟的毫秒数
// 定义一个函数，用于格式化时间
const formatTime = (val: number): string => {
  // 如果传入的值小于等于0，则返回'00'
  if (val <= 0) return '00';
  // 如果传入的值小于10，则在前面加一个'0'，否则直接返回传入的值
  return val < 10 ? `0${val}` : `${val}`;
};
// 定义一个函数，用于将剩余时间转换为天、小时、分钟和秒
const getTime = (format: string, timeLeft: number) => {
  // 将剩余时间赋值给变量d
  let d = timeLeft;
  // 使用map方法，将[1000, 60, 60, 24]数组中的每个元素作为单位，计算剩余时间中的天数、小时数、分钟数和秒数
  let [_, s, m, h] = [1000, 60, 60, 24].map((unit) => {
    // 计算剩余时间中的秒数
    let num = d % unit;
    // 更新剩余时间，减去秒数
    d = Math.floor(d / unit);
    // 返回秒数
    return num;
  });
  if (timeLeft > DAY_MILLISECONDS && format.indexOf('d') === -1) {
    h += d * 24;
  }

  if (timeLeft > HOURS_MILLISECONDS && format.indexOf('h') === -1) {
    m += h * 60;
  }

  if (timeLeft > MINUTES_MILLISECONDS && format.indexOf('m') === -1) {
    s += m * 60;
  }
  return {
    dd: formatTime(d),
    hh: formatTime(h),
    mm: formatTime(m),
    ss: formatTime(s),
    d,
    h,
    m,
    s,
  };
};
type formatType = 'dd' | 'hh' | 'mm' | 'ss';
// 导出一个函数，用于获取时间项
export const getTimeItems = (format: string, timeLeft: number) => {
  // 匹配format
  const timeArr: Array<string> = format!.match(/[a-zA-Z]{1,3}/g) || [];
  // 匹配字符
  let symbolArr = format.match(/[\u4e00-\u9fa5]+|[^a-zA-Z]/g) || [];
  // console.log(timeArr);
  // console.log(symbolArr);
  // 获取时间
  const time = getTime(format, timeLeft);
  // 返回时间项数组
  return timeArr.map((item, i) => {
    return {
      num: time[item.toLowerCase() as formatType],
      symbol: symbolArr[i],
    };
  });
};
